import {getToken,setToken,removeToken,setTimeStamp} from '@/utils/auth'
import {login,getLoginUser} from '@/api/user'
import {resetRouter} from '@/router'
import store from "@/store";

//状态
const state={
  token:getToken(),   //设置token为共享状态，初始化vuex的时候，就先从缓存中读取
  userInfo:{}// 定义一个空的对象 不是null 因为后边我要开发userInfo的属性给别人用  userInfo.name
}
//修改状态
const mutations={
  //维持vuex数据的持久化
  SetToken(state,token){
    state.token=token  //将数据设置给vuex
    setToken(token)//同步给缓存
  },
  RemoveToken(state){
    state.token=null //将vuex的token置空
    removeToken() //同时去掉缓存中的token
  },
  // 设置用户信息
  setUserInfo(state, userInfo) {
    state.userInfo = { ...userInfo } // 用 浅拷贝的方式去赋值对象 因为这样数据更新之后，才会触发组件的更新
  },
  // 删除用户信息
  reomveUserInfo(state) {
    state.userInfo = {}
  }

}
//==================执行异步
const actions={
  //登录逻辑
 async login(context,data){
    //调用了api接口
    const result=await login(data) //拿到token
    context.commit('SetToken', result)//设置token
   setTimeStamp() //设置时间戳

  },
  //获取登录用户的信息
  async getloginUser(context){
    const result=await getLoginUser()
    context.commit('setUserInfo', result.userInfo) // 将整个的个人信息设置到用户的vuex数据中

    return result // 这里为什么要返回 为后面埋下伏笔
  },
  //登出操作
  logout(context){

   //删除token
    context.commit('RemoveToken')
    //用户登录用的资料
    context.commit('reomveUserInfo')
    //重置路由
    resetRouter()

    store.dispatch('tagsView/delAllViews')

    // 还有一步  vuex中的数据是不是还在
    // 要清空permission模块下的state数据
    // vuex中 user子模块  permission子模块


    context.commit('permission/setRoutes', [], { root: true })
    context.commit('permission/setPoints', null, { root: true })
    // 子模块调用子模块的action  默认情况下 子模块的context是子模块的(没有加锁的情况下 )
    //不加命名空间的情况下 所有的mutations和actions都是挂载在全局上的，所以可以直接调用
    //加了命名空间，就用上面我们这种方式，也就是加上第三个参数
    // 父模块 调用 子模块的action
  }




}


export default {

  namespaced:true,
  state,
  mutations,
  actions


}
